pip and transitive dependencies
例:project-aを開発している
code:project-aのrequirements.txt
project-b==0.0.1
code:project-bのrequirements.txt
python-dateutil==2.4.2
Now if you pip install project-a’s dependencies using something like pip install -r requirements.txt, you will be very sad to find that the python-dateutil library you have installed for project-a is actually the newest released version of python-dateutil, and not necessarily 2.4.2.
「project-aでpip install -r requirements.txtすると、python-dateutilはproject-bの指定ではなく、その時の最新が入る」
project-aから見て、project-bがdirect、python-dateutilがtransitive
なぜこれが起きるのか
If a transitive dependency is not explicitly specified in a project’s requirements.txt, pip will grab the version of the required library specified in the project’s install_requires section (of setup.py).
「transitive dependencyがプロジェクトのrequirements.txtで明白に(バージョンを)指定されないならば、pipはそのプロジェクトの(setup.pyの)install_requiresセクションに指定されている要求されたライブラリのバージョンを取ってくる」
If this section does not explicitly pin a version, you end up getting the latest version of that library.
「このセクションがバージョンを明白に固定しないならば、そのライブラリ(transitive dependency)の最新バージョンを得るという結果になる」
どうすべきか
If your application needs a specific version of a transitive dependency, pin it yourself in your application’s requirements.txt file.
「あなたのアプリケーションがtransitive dependencyの特定のバージョンを必要とするなら、アプリケーションのrequirements.txtファイルで固定してください」
You do also have the option of pinning the version in setup.py itself, but this is considered bad form.
「setup.py自身でバージョンを固定する選択肢もあるが、これはよくないスタイルと考えられている」